Resource allocation techniques for distributed computer systems with resource-consuming clients, such as virtual machines (VMs), are important to ensure that the clients are operating at desired or target levels. For example, if a VM dedicated to sales is running on a host computer where CPU and memory are overextended to other VMs, that VM may not be able to process orders at an acceptable level. In such a situation, additional resources of the host computer should be allocated to the sales VM or the sales VM should be moved to another host computer that has sufficient resources so that the sales VM can run efficiently at or above the acceptable level.
Conventional resource allocation techniques make changes with respect to resource allocation in a distributed computer system by examining at least the current utilizations of various resources and the current requirements of the various components of the distributed computer system. The resource allocation techniques may involve load balancing and resource scheduling. When attempting to load balance clients, e.g., VMs, running on host computers, these conventional resource allocation techniques consider various user-defined constraints, which include both implicit rules (for example, compatibility rules) and explicit rules (for example, affinity rules). Due to these various constraints, the resource allocation techniques may not be able to effectively balance the clients among the different host computers. When this occurs, the current resource allocation techniques merely inform users that the distributed computer system is imbalanced without any further information.